/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package infoserver;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.*;

/**
 *
 * @author Erik
 */
public class GUI extends JFrame implements ActionListener {
    
    //Variabelen van de tabs
    private JTabbedPane tabbedPane;
    private JPanel tabStatus;
    private JPanel tabSettings;
    private JPanel tabLog;
    private JPanel tabHelp;
    
    //Aanmaken van de variabelen die in de tabs gebruikt worden
    
    //Status tab
    private JTextArea areaRun = new JTextArea(1,1); //Het grote tekstveld waar de huidige activiteiten op worden weergeven
    private JTextField fieldCmd = new JTextField(10); //Het command input tekstveld
    private JButton buttonStart = new JButton("Start"); //De button om de server mee te starten
    private JButton buttonStop = new JButton("Stop"); //De button om de server mee te stoppen
    private JButton buttonRestart = new JButton("Restart"); //De button om de server mee te restarten
    
    private String ipaddress;
    private int port;
    private int nrusers;
    private String status;
    private BufferedReader br;
    
    //Settings tab
    private JTextField fieldIp = new JTextField(1); //Het tekstveld waarin het Ip address in kan worden aangepast
    private JTextField fieldPort = new JTextField(1); //Het tekstveld waarin het Port nummer kan worden aangepast
    private JTextField fieldDbname = new JTextField(1); //Het tekstveld waarin de naam van de database kan worden aangepast
    private JTextField fieldUser = new JTextField(1); //Het tekstveld waarin de username kan worden aangepast
    private JPasswordField fieldPass = new JPasswordField(1); //Het tekstveld waarin het password kan worden aangepast
    private JTextField fieldLocation = new JTextField(1); //Het tekstveld waarin de locatie van de log bestanden wordt weergeven
    private JButton buttonBrowse = new JButton("Browse"); //De knop om te zoeken naar de locatiemap waarin de log bestanden zitten
    private JButton buttonSave = new JButton("Save"); //De knop om de wijzigingen op te slaan
    
    //Log tab
    private DefaultListModel listItem = new DefaultListModel(); //Dit is het model en de vormgeving van de list
    private JButton buttonOpen = new JButton("Open"); //Knop om het geselecteerde bestand mee te openen
    private JButton buttonDelete = new JButton("Delete"); //Knop om het geselecteerde bestand mee te verwijderen
    private JButton buttonRefresh = new JButton("Refresh"); //Knop om de lijst met log-bestanden te refreshen
    Log log = new Log(getPath());
    //Help tab
    private JTextArea fieldHelp = new JTextArea(1,1); //Het veld waarin de hulptekst wordt weergeven
    JList list = new JList(listItem);
    
    //Constructor
    public GUI(){
         
        //Standaard schermgegevens aanmaken
        setTitle("Infoserver");
        setSize(480, 480);
        setBackground(Color.WHITE);
        setResizable(false);
        
        //Dit zorgt ervoor dat de juiste Tab (de tab waarop geklikt is) wordt weergeven
        JPanel topPanel = new JPanel();
        topPanel.setLayout(new BorderLayout());
        getContentPane().add(topPanel);
        
        //Het aanroepen van de functies die de tabs aanmaken (in deze functies is het "subscherm" opgebouwd
       createTabStatus();
       createTabSettings();
       createTabLog();
       createTabHelp();
       
       //De tabbladbar aanmaken
       tabbedPane = new JTabbedPane();
       tabbedPane.addTab("Status", tabStatus);
       tabbedPane.addTab("Settings", tabSettings);
       tabbedPane.addTab("Log", tabLog);
       tabbedPane.addTab("Help", tabHelp);
       topPanel.add(tabbedPane, BorderLayout.CENTER);
       
       //Toevoegen van actionlisteners
       //Status tab
       buttonStart.addActionListener(this);
       buttonStop.addActionListener(this);
       buttonRestart.addActionListener(this);
       //Log tab
       buttonDelete.addActionListener(this);
       buttonRefresh.addActionListener(this);    
       buttonOpen.addActionListener(this);
    }
    
    //Deze functie maakt het tab aan waarin de status van de server wordt weergeven
    public void createTabStatus(){
        //Eerst wordt een nieuw Jpanel aangemaakt, deze is zonder layout, alles wordt dus met coordinaten geplaatst
        tabStatus = new JPanel();
        tabStatus.setLayout(null);
        
        //Het stukje tekst waar het Ip Address wordt weergeven, HET IP ADDRESS MOET VERVANGEN WORDEN DOOR EEN GETTER
        JLabel labelIP = new JLabel("Ip Address: " + ipaddress);
        labelIP.setBounds(10,15,160,20);
        tabStatus.add(labelIP);
        
        //Het stukje tekst waar het port nummer wordt weergeven, HET PORT NUMMER MOET VERVANGEN WORDEN DOOR EEN GETTER
        JLabel labelPort = new JLabel("Port: " + port);
        labelPort.setBounds(175, 15, 80, 20);
        tabStatus.add(labelPort);
        
        //Het stukje tekst waar het aantal connecties wordt weergeven, HET NUMMER MOET VRVANGEN WORDEN DOOR EEN GETTER
        JLabel labelConnections = new JLabel("Connections: " + nrusers);
        labelConnections.setBounds(300, 15, 150, 20);
        tabStatus.add(labelConnections);
        
        //Het stukje tekst waar de status van de server wordt weergeven, DE STATUS MOET VERVANGEN WORDEN DOOR EEN GETTER
        JLabel labelStatus = new JLabel("Status: " + status);
        labelStatus.setBounds(10, 40, 150, 20);
        tabStatus.add(labelStatus);
        
        //Hier wordt de textarea aangemaakt, dit is voor de properties
        areaRun.setLineWrap(true);
        areaRun.setWrapStyleWord(true);
        areaRun.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); //border wordt aangemaakt voor de scrollbar
        areaRun.disable();
        
        //Hier wordt de scrollbar aangemaakt, het textfield wordt aan de scrollbar toegevoegd en daarna wordt deze aangemaakt
        JScrollPane scrollBar = new JScrollPane(areaRun);
        scrollBar.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        scrollBar.setBounds(10, 65, 450, 300);
        tabStatus.add(scrollBar);
        
        //Het veld waarin een command getypt kan worden wordt hier toegevoegd
        fieldCmd.setBounds(10, 370, 150, 20);
        fieldCmd.setText("Command input");
        tabStatus.add(fieldCmd);
        
        //De button om de server te starten wordt hier toegevoegd
        buttonStart.setBounds(180, 370, 75, 30);
        tabStatus.add(buttonStart);
        
        //De button om de server te stoppen wordt hier toegevoegd
        buttonStop.setBounds(260, 370, 75, 30);
        tabStatus.add(buttonStop);
        
        //De button om de server te restarten wordt hier toegevoegd
        buttonRestart.setBounds(340, 370, 85, 30);
        tabStatus.add(buttonRestart);
        
    }
    
    //Deze functie maakt het tab aan waarin de settings van de server worden weergeven
    public void createTabSettings(){
        //Eerst wordt een nieuw Jpanel aangemaakt, deze is zonder layout, alles wordt dus met coordinaten geplaatst
        tabSettings = new JPanel();
        tabSettings.setLayout(null);
        
        JLabel labelDbserver = new JLabel("Database server:");
        labelDbserver.setBounds(10,15,150,20);
        tabSettings.add(labelDbserver);
        
        JLabel labelIp = new JLabel ("Ip Address");
        labelIp.setBounds(10, 40, 100, 20);
        tabSettings.add(labelIp);
        
        //Hier wordt het veld toegevoegd waar het Ip address kan worden veranderd, huidige IP address wordt ook weergeven
        fieldIp.setBounds(120, 40, 100, 20);
        fieldIp.setText("127.127.127.127");
        tabSettings.add(fieldIp);
        
        JLabel labelPort = new JLabel("Port");
        labelPort.setBounds(10, 65, 100, 20);
        tabSettings.add(labelPort);
        
        //Hier wordt het veld toegevoegd waar het port nummer kan worden veranderd, huidige port nummer wordt ook weergeven
        fieldPort.setBounds(120, 65, 60, 20);
        fieldPort.setText("808000");
        tabSettings.add(fieldPort);
        
        JLabel labelDbname = new JLabel("Database name");
        labelDbname.setBounds(10, 90, 100, 20);
        tabSettings.add(labelDbname);
        
        //Hier wordt het veld toegevoegd waar de databse naam kan worden veranderd, huidige database naam wordt ook weergeven
        fieldDbname.setBounds(120, 90, 120, 20);
        fieldDbname.setText("Test Database");
        tabSettings.add(fieldDbname);
        
        JLabel labelUser = new JLabel("Username");
        labelUser.setBounds(10, 115, 100, 20);
        tabSettings.add(labelUser);
        
        //Hier wordt het veld toegevoegd waar de username kan worden veranderd, huidige username wordt ook weergeven
        fieldUser.setBounds(120, 115, 120, 20);
        fieldUser.setText("Jan");
        tabSettings.add(fieldUser);
        
        JLabel labelPass = new JLabel("Password");
        labelPass.setBounds(10, 140, 100, 20);
        tabSettings.add(labelPass);
        
        //Hier wordt het veld toegevoegd waar het wachtwoord kan worden veranderd, huidige wachtwoord wordt ook weergeven in bolletjes
        fieldPass.setBounds(120, 140, 100, 20);
        fieldPass.setText("wachtwoord");
        tabSettings.add(fieldPass);
        
        JLabel labelLocation = new JLabel("Log location:");
        labelLocation.setBounds(10, 200, 200, 20);
        tabSettings.add(labelLocation);
        
        //Hier wordt het veld toegevoegd waar de locatie van de log bestanden kan worden veranderd, huidige locatie wordt ook weergeven
        fieldLocation.setBounds(10, 225, 300, 20);
        fieldLocation.setText("C://Server files/logs/");
        tabSettings.add(fieldLocation);
        
        //Hier wordt de button toegevoegd waarmee door maps heen gebrowsed kan worden om een locatie voor de log bestanden te kiezen
        buttonBrowse.setBounds(315, 225, 80, 20);
        tabSettings.add(buttonBrowse);
        
        //Hier wordt de button toegevoegd om de aangepaste settings op te slaan
        buttonSave.setBounds(380, 400, 70, 20);
        tabSettings.add(buttonSave);
        
        
    }
    
    //Deze functie maakt het tab aan waarin log bestanden kunnen worden geopend en worden bekeken
    public void createTabLog(){
        //Eerst wordt een nieuw Jpanel aangemaakt, deze is zonder layout, alles wordt dus met coordinaten geplaatst
        tabLog = new JPanel();
        tabLog.setLayout(null);
        addElements();
        
        //Hier wordt de lijst aangemaakt
        //JList list = new JList(listItem);
        list.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); //border wordt aangemaakt voor de scrollbar
        
        //De lijst wordt toegevoegd aan de scrollbar en de scrollbar wordt toegevoegd aan het tabblad
        JScrollPane scrollBar = new JScrollPane(list);
        scrollBar.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        scrollBar.setBounds(10, 15, 300, 400);
        tabLog.add(scrollBar);
        
        //Hier wordt de button om de bestandenlijst mee te refreshen toegevoegd
        buttonRefresh.setBounds(330, 130, 80, 30);
        tabLog.add(buttonRefresh);
        
        //Hier wordt de button om bestanden mee te openen toegevoegd
        buttonOpen.setBounds(330, 170, 80, 30 );
        tabLog.add(buttonOpen);
        
        //Hier wordt de button om bestanden mee te verwijderen toegevoegd
        buttonDelete.setBounds(330, 210, 80, 30);
        tabLog.add(buttonDelete);
    }
    
    //Deze functie maakt het tab aan waarin de hulp tekst wordt weergeven
    public void createTabHelp(){
        //Eerst wordt een nieuw Jpanel aangemaakt, deze is zonder layout, alles wordt dus met coordinaten geplaatst
        tabHelp = new JPanel();
        tabHelp.setLayout(null);
        
        //Hier wordt de textarea aangemaakt, dit is voor de properties
        fieldHelp.setEditable(false);
        fieldHelp.setText("Hier komt de help tekst te staan, deze tekst wordt automatisch afgebroken en de scrollbar functioneert ook automatisch");
        fieldHelp.setLineWrap(true);
        fieldHelp.setWrapStyleWord(true);
        fieldHelp.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); //border wordt aangemaakt voor de scrollbar
        
        //Hier wordt de scrollbar aangemaakt, het textfield wordt aan de scrollbar toegevoegd en daarna wordt deze aangemaakt
        JScrollPane scrollBar = new JScrollPane(fieldHelp);
        scrollBar.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        scrollBar.setBounds(10, 15, 450, 400);
        tabHelp.add(scrollBar);
        
    }
    
    //Methodes die gebruikt kunnen worden om de tekst te setten
    
    //Tab status
    public void setAreaRun(){
            File currentLog = Log.lastFileModified(getPath());
            try{
                br = new BufferedReader(new FileReader(currentLog));
                    String all = "";
                    String thisLine;
                        while((thisLine = br.readLine()) != null){
                            all += thisLine + "\n";
                        }
                    br.close();
                    areaRun.setText(all);
            }
            catch(IOException e){
                System.out.println(e.getMessage());
            }
    }
    
    public void setFieldCmd(String s){
        fieldCmd.setText(s);
    }
    
    public void setIpLabel(String s){
        this.ipaddress = s;
    }
    
    public void setPortLabel(int i){
        this.port = i;
    }
    
    public void setNrusersLabel(int i){
        this.nrusers = i;
    }
    
    public void setStatusLabel(String s){
        this.status = s;
    }
    
    //Tab settings
    public void setFieldIp(String s){
        fieldIp.setText(s);
    }
    
    public void setFieldPort(String s){
        fieldPort.setText(s);
    }
    
    public void setFieldDbname(String s){
        fieldDbname.setText(s);
    }
   
    public void setFieldUser(String s){
        fieldUser.setText(s);
    }
    
    //Log tab    
    //Haalt de path van de directory van de log bestanden op uit de settings
    public String getPath(){
        return "C:\\Users\\Erik\\Desktop\\School\\PERIODE 4\\KBSlokaal\\Infoserver\\Log";
    }
    
    //Add een lijst van de log bestanden in de listItem
    public void addElements(){
        File aDirectory = new File(getPath());
        String[] filesInDir = aDirectory.list();
            for ( int i=0; i<filesInDir.length; i++ )
            {
                String file = filesInDir[i];
                int mid = file.lastIndexOf(".");
                String ext = file.substring(mid+1,file.length());
                if("log".equals(ext)){
                    listItem.addElement(filesInDir[i]);
                }
            }
    }
    
    //Verversd de listItem
    public void refreshElements(){
        listItem.clear();
        addElements();
    }
    
    //Schrijft de meegegeven tekst weg in het log bestand en zorgt dat er een visuele weergave is in het status tab
    public void writeLog(String s){
        log.writeLog(s);
        setAreaRun();
    }
    
    //Help tab
    public void setFieldHelp(String s){
        fieldHelp.setText(s);
    }
    
    //Dingen die moeten gebeuren nadat er op een knop is gedrukt
    @Override
    public void actionPerformed(ActionEvent e) {
        //Knoppen van het status tab
        //als er op de knop start server is gedrukt
        if(e.getSource() == buttonStart){
            writeLog("Starting the server");
        }
        if(e.getSource() == buttonStop){
            writeLog("Stopping the server");
        }
        if(e.getSource() == buttonRestart){
            writeLog("Restarting the server");
        }
        
        //Knoppen van het log tab
        //Als er op de knop open log file is gedrukt
        if(e.getSource() == buttonOpen){
            String selectedValue = (String) list.getSelectedValue(); //leest het de selectie van de gebruiker uit
            if(selectedValue == null){ //als er niks geselecteerd is wordt er een foutmelding weergeven
                JOptionPane.showMessageDialog(this, "Please select a file");
            }
            else{ //maakt een LogDialog aan en stuurt het geselecteerde bestand mee
            LogDialog logDialog = new LogDialog(this, getPath(), selectedValue);
            logDialog.setVisible(true);
            }
        }
        //als er op de delete knop is gedrukt
        if(e.getSource() == buttonDelete){
            String selectedValue = (String) list.getSelectedValue(); //leest het de selectie van de gebruiker uit
            if(selectedValue == null){ //kijkt of er een bstand geselecteerd is, zo niet dan wordt er een foutmelding weergeven
                JOptionPane.showMessageDialog(this, "Please select a file");
            }
            else{
            File selectedFile = new File(getPath(), selectedValue); //Maakt een File object van het geselecteerde bestand
            if(!selectedFile.exists()){ //kijtkt of het geselecteerde bestand bestaat, zo niet wordt er een foutmelding weergeven
                JOptionPane.showMessageDialog(this, "Selected file does not exist, it might be possible that the file is already removed");
            }
            else{
            if(!selectedFile.canWrite()){ //kijkt of er permissie is om het bestand te verwijderen, zo niet wordt er een foutmelding weergeven
                JOptionPane.showMessageDialog(this, "Selected file could not be removed");
            }
            else{
                File currentLog = Log.lastFileModified(getPath());; //haalt het momenteel gebruikte log bestand op
            if(selectedFile.equals(currentLog)){ //kijkt of het geselecteerde bestand gelijk is aan het huidige log bestand, zo ja wordt er een foutmelding weergeven
                JOptionPane.showMessageDialog(this, "Selected file is currently being used by the program, file could not be removed");
            }
            else{
                //Er wordt eerst een dialog weergeven waar om een bevesteging wordt gevraagd
                JOptionPane pane = new JOptionPane("Are you sure you want to delete the selected file?"); //De vraag die gesteld wordt
                Object[] options = new String[] { "Yes", "No" }; //De antwoorden die gekozen kunnen worden
                pane.setOptions(options);
                JDialog dialog = pane.createDialog(new JFrame(), "Delete " + selectedValue);
                dialog.show();
                Object obj = pane.getValue(); 
                    int result = -1;
                    for (int k = 0; k < options.length; k++)
                    if (options[k].equals(obj))
                    result = k; //ontvant de waarde van de gekozen knop, 0 = optie1, 1 = optie2, etc, -1 = het kruisje van sluiten
                    if(result == 0){ //als er op yes gedrukt is wordt het bestand verwijdert en de lijst gerefreshed
                        selectedFile.delete();
                        writeLog("The " + selectedValue + " has been deleted succesfully");
                        refreshElements();
                    }
            }
            }
            }
            }
        }
        //Als er op de refresh knop is gedrukt
        if(e.getSource() == buttonRefresh){
            refreshElements(); //refreshed de list van de log bestanden
        }
    }

}
    
 
